package util

import (
	"crypto/aes"
	"crypto/md5"
	"crypto/rand"
	"encoding/base64"
	"encoding/hex"
	"fmt"
)

// GenerateKey 生成 AES 密钥（128位）
func GenerateKey() (string, error) {
	key := make([]byte, 16) // AES-128 使用 16 字节的密钥
	_, err := rand.Read(key)
	if err != nil {
		return "", err
	}
	encodedKey := base64.StdEncoding.EncodeToString(key) // 将密钥编码成 base64 字符串
	return encodedKey, nil
}

// Encrypt 使用 AES 加密数据（AES/ECB/PKCS5Padding）
func Encrypt(data, key string) (string, error) {
	keyBytes := []byte(key)

	// 创建 AES 加密块
	block, err := aes.NewCipher(keyBytes)
	if err != nil {
		return "", err
	}

	// 明文转为字节切片
	plaintext := []byte(data)
	fmt.Printf("Plaintext before padding: %s\n", plaintext)

	plaintext = pkcs5Padding(plaintext, block.BlockSize()) // PKCS5 填充
	fmt.Printf("Plaintext after padding: %s\n", plaintext)

	// 加密过程使用 ECB 模式
	ciphertext := make([]byte, len(plaintext))
	for i := 0; i < len(plaintext); i += block.BlockSize() {
		block.Encrypt(ciphertext[i:i+block.BlockSize()], plaintext[i:i+block.BlockSize()])
	}

	// 返回加密后的 Base64 编码数据
	encodedCiphertext := base64.StdEncoding.EncodeToString(ciphertext)
	fmt.Printf("Ciphertext (Base64 encoded): %s\n", encodedCiphertext)
	return encodedCiphertext, nil
}

// Decrypt 使用 AES 解密数据（AES/ECB/PKCS5Padding）
func Decrypt(encryptedData, key string) (string, error) {
	keyBytes := []byte(key)

	// 解码加密数据
	ciphertext, err := base64.StdEncoding.DecodeString(encryptedData)
	if err != nil {
		return "", err
	}

	// 创建 AES 解密块
	block, err := aes.NewCipher(keyBytes)
	if err != nil {
		return "", err
	}

	// 解密过程使用 ECB 模式
	plaintext := make([]byte, len(ciphertext))
	for i := 0; i < len(ciphertext); i += block.BlockSize() {
		block.Decrypt(plaintext[i:i+block.BlockSize()], ciphertext[i:i+block.BlockSize()])
	}

	// 去掉填充
	plaintext, err = pkcs5Unpadding(plaintext, block.BlockSize())
	if err != nil {
		return "", err
	}

	return string(plaintext), nil
}

// PKCS5Padding 对数据进行填充，确保数据的长度是块大小的倍数
func pkcs5Padding(data []byte, blockSize int) []byte {
	padding := blockSize - len(data)%blockSize // 计算填充的字节数
	padText := make([]byte, padding)
	for i := 0; i < padding; i++ {
		padText[i] = byte(padding) // 填充字节
	}
	return append(data, padText...) // 返回填充后的数据
}

// PKCS5Unpadding 去除填充，恢复原始数据
func pkcs5Unpadding(data []byte, blockSize int) ([]byte, error) {
	length := len(data)
	unpadding := int(data[length-1]) // 获取填充的字节数
	if unpadding > length {
		return nil, fmt.Errorf("padding size is invalid")
	}
	return data[:(length - unpadding)], nil // 去除填充
}

func demo() {
	// 示例：生成密钥并加密/解密数据
	key := "DJS2giHB3NzyAad5UbN7YQ==" // 这个密钥是固定的，和你的Java代码中的一样
	data := "哈哈"
	fmt.Println("Original data:", data)

	// 加密
	encryptedData, err := Encrypt(data, key)
	if err != nil {
		fmt.Println("Error encrypting data:", err)
		return
	}
	fmt.Println("Encrypted data:", encryptedData)

	encryptedData = "TYasoglPE9KqlJs7JHf9m2V3wDSGm5X1X7PnWtfptWnL9vqPUQa8iPDUy1dYG+Gt+RV/6ME5AYcGsK2/AQwlt7CvrUqzlx0Ps6a2pLyjHxOiY1liwz4RH17e26U+e0Xxxp5LRe03VwPsLFxk2klDyXI7MZkzBkGSvpKxkO2vmkZ8BP1dZPjr8ME6X++5fTp82gbYeWvnf95q1SZLPdBgy/cu7wI8oP+aAPRyYLzbI/2/MWGtBzKaz+mWTjb4699iiXstaT3IES5TZrTj5RghZ3I7MZkzBkGSvpKxkO2vmkbtQnEswlMpqGm9HZ/9k3HG6KIsVKS05X+HIFmo2SewgtMaWyXCGhge+uf561xhEyCDV8qytmm27oe3WvR0rhnSTeAxawmIxC2E3cnMhbDq4zJUT2gNCQ2Pln4p4hBHGygXvpTd1tmo1OHl4M+lB5Va6GVQnxFqBjBD1XVpe8ruodpEmLK78q+sHDAq9GqKGtraBth5a+d/3mrVJks90GDL9y7vAjyg/5oA9HJgvNsj/XsvXxWHfyVsL9tHoN+nmxul22DNrutlmoGRuKC/5O/a0E9pdAcKix/cIH+kDtL5Bb4hfZTNBCxHIUbvylyGC2KIiEyyn3KKtqgAeXRAZQYUtz7HqPDCLCtGs5/T6ZobE8A5ZviE4mNR2PLx7l9u8XyhiFuuMfWffbL+ICYvgt+o0AFuHDOKWgA7WtAyUnaXxPb8LWS6OL2ZeUFLdtBDEBmeu5Nu/0V6d6gZLAgjOnz7"
	// 解密
	decryptedData, err := Decrypt(encryptedData, key)
	if err != nil {
		fmt.Println("Error decrypting data:", err)
		return
	}
	fmt.Println("Decrypted data:", decryptedData)
}

func HashString(s string) string {
	hash := md5.Sum([]byte(s))
	return hex.EncodeToString(hash[:])
}
